出处:掘金
原作者:前端微白
| 维度 | Loader | Plugin |
|---|---|---|
| 工作阶段 | 文件加载时(单文件处理) | 整个构建周期(全局操作) |
| 功能 | 转换文件内容 | 扩展构建能力 |
| 典型场景 | 编译 JSX/SASS | 资源优化/环境注入 |
@babel/core 编译会增加配置复杂度,babel-loader 与 Webpack AST 解析深度集成,可复用解析结果减少重复计算// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/, // 关键!避免编译已兼容代码
use: {
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', { targets: "iOS >= 9, Chrome > 60" }]
]
}
}
}
]
}
}
css-loader:解析 @import 与 url() 语句style-loader:将 CSS 动态注入 DOM(<style> 标签){
test: /\.js$/,
use: [
{
loader: 'thread-loader',
options: { workers: 4 } // 根据 CPU 核心数配置
},
'babel-loader' // 后续 loader 在 worker 线程运行
]
}
// 自动注入所有 chunk
new HtmlWebpackPlugin({
template: './src/index.html', // 自定义模板
filename: 'home.html',
chunks: ['vendors', 'home'] // 仅注入指定 chunk
})
| 方案 | 开发环境 | 生产环境 | 特点 |
|---|---|---|---|
| style-loader | ✅ | ❌ | 样式内联 |
| MiniCssExtractPlugin | ❌ | ✅ | 独立 CSS 文件 |
// 替代 style-loader
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
plugins: [new MiniCssExtractPlugin({ filename: '[name].[contenthash].css' })],
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'] // 链式调用
}
]
}
};
.gitignore 管理// webpack.prod.js
new webpack.DefinePlugin({
'process.env.API_BASE': JSON.stringify('https://api.prod.com')
});
// webpack.dev.js
new webpack.DefinePlugin({
'process.env.API_BASE': JSON.stringify('https://api.dev.com')
});
// 代码中使用
axios.get(`${process.env.API_BASE}/user`);
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
}
}
}
}